
#include "Pantalla.h"
#include <SDL.h>
#include "Logger.h"


bool Pantalla::instance = false;
Pantalla* Pantalla::singleton = 0 ;

void Pantalla::iniciarSDL(){
	// Iniciar SDL
	if (SDL_Init(SDL_INIT_VIDEO)<0){
		std::stringstream ss;
		ss << "Error al iniciar SDL:: " << SDL_GetError() ;
		Logger::getInstance()->err(ss.str());
		Logger::getInstance()->flush();
		exit (-1);
	}
}

void Pantalla::calcularTamanioPantalla(){
	const SDL_VideoInfo* info = SDL_GetVideoInfo(); 
	this->ancho = info->current_w; 
	this->alto = info->current_h; 
}

Pantalla::Pantalla(){
	iniciarSDL();
	calcularTamanioPantalla();
}

Pantalla* Pantalla::getInstance(){
	if(!Pantalla::instance){
		Pantalla::singleton = new Pantalla();
		Pantalla::instance = true;
	}
	return Pantalla::singleton;
}
void Pantalla::setDimensiones(int ancho, int alto){
	if(ancho > 0)
		this->ancho = ancho ;

	if(alto > 0)
		this->alto = alto ;

}

void Pantalla::setFondo(Textura *fondo){

		 // Activamos modo de video
	SDL_Surface * tmp = SDL_SetVideoMode(this->ancho,this->alto,24,SDL_HWSURFACE | SDL_RESIZABLE);
	if (!tmp){
		std::stringstream  ss;
		ss << "Error al iniciar el contexto SDL:: " << SDL_GetError();
		Logger::getInstance()->err(ss.str());
		Logger::getInstance()->flush();
		exit (-1);
	}else{
		ImageBMP* imgTmp = new ImageBMP(tmp);
		
		//nombre a la ventana
		SDL_WM_SetCaption(":: TP Taller - Entrega 2 :: ",NULL);
		
		if(fondo){
			// Me hago una copia de la imagen para redimensionarla
			// Evito alterar la textura que depues sera usada en un casillero.
			ImageBMP *imgFondo;
			fondo->getImagen()->redimensionar(&imgFondo,this->alto,this->ancho);

			imgTmp->colocarImagenDentro(imgFondo,0,0);
		}

		this->textura = new Textura("Fondo");
		this->textura->setImagen(imgTmp);
	}
}

void Pantalla::agregarTextura(Textura *texturaAInsertar, int x, int y, Color* colorTransparente){
	if(this->textura)
		this->textura->agregar(texturaAInsertar,x,y,colorTransparente);	
}

void Pantalla::agregarTextura(Textura *texturaAInsertar, int x, int y){
	if(this->textura)
		this->textura->agregar(texturaAInsertar,x,y,0);
}

int Pantalla::getAncho(){
	return this->ancho;
}

int Pantalla::getAlto(){
	return this->alto;
}

void Pantalla::refrescar(){
	if(this->textura && this->textura->getImagen() )
		SDL_Flip(this->textura->getImagen()->getImage());
}

Textura* Pantalla::getTextura(){
	return this->textura;
}

void Pantalla::cerrar(){
	//Quit SDL 
    SDL_Quit();
	delete this->textura;
}